package com.ruoyi.performance.service.impl;

import com.google.common.base.Joiner;
import com.ruoyi.common.constant.Constants;
import com.ruoyi.common.utils.ServletUtils;
import com.ruoyi.common.utils.StringUtils;
import com.ruoyi.performance.domain.PerfLevelTemplate;
import com.ruoyi.performance.domain.PerfTemplate;
import com.ruoyi.performance.dto.PerfLevelTemplateDto;
import com.ruoyi.performance.dto.PerfTemplateDto;
import com.ruoyi.performance.mapper.PerfCheckMapper;
import com.ruoyi.performance.mapper.PerfTemplateMapper;
import com.ruoyi.performance.service.PerfTemplateService;

import lombok.extern.slf4j.Slf4j;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.redis.core.RedisTemplate;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
import org.springframework.transaction.interceptor.TransactionAspectSupport;

import javax.annotation.Resource;

import static com.ruoyi.performance.service.impl.PerfLevelScoreServiceImpl.INITIAL;

import java.text.MessageFormat;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.Date;
import java.util.List;
import java.util.Map;
import java.util.concurrent.TimeUnit;

/**
 * @author YL
 * @date 2020/8/26 8:41
 * @description 绩效模板Service接口实现类
 */
@Service
@Slf4j
public class PerfTemplateServiceImpl implements PerfTemplateService {
	
	static final String New = "0";
	static final String Publish = "1";
	static final String Cancel = "2";
    @Autowired
    private PerfCheckMapper perfCheckMapper;
	@Autowired
	private RedisTemplate<String, Object> redisTemplate;
	
    @Resource
    private PerfTemplateMapper perfTemplateMapper;

    /**
     * 查询绩效模板
     *
     * @param id 绩效模板ID
     * @return 绩效模板
     */
    @Override
    public List<PerfTemplateDto> selectPerfTemplateById(int id) {

        return perfTemplateMapper.selectPerfTemplateById(id);
    }

    /**
     * 根据公司代码查询绩效模板
     *
     * @param companyCode 公司代码
     * @return 绩效模板
     */
    @Override
    public List<PerfTemplateDto> selectPerfTemplateByCompanyCode(String companyCode){
        return perfTemplateMapper.selectPerfTemplateByCompanyCode(companyCode);
    }
    /**
     * 查询绩效模板列表
     *
     * @param perfTemplateDto 绩效模板
     * @return 绩效模板集合
     */
    @Override
    public List<PerfTemplateDto> selectPerfTemplateList(PerfTemplateDto perfTemplateDto) {
    	// 拆分状态字符串
		List<String> statuslist = perfTemplateDto.getStatuslist();
		if (statuslist != null && statuslist.size() > 0) {
			String status = "'" + StringUtils.join(statuslist, "','") + "'";
			perfTemplateDto.setStatus(status);
		}
    	return perfTemplateMapper.selectPerfTemplateList(perfTemplateDto);
    }

    /**
     * 新增绩效模板
     *
     * @param perfTemplate 绩效模板
     * @return 结果
     */
    @Override
    public int insertPerfTemplate(PerfTemplate perfTemplate) {
        String username = ServletUtils.getRequest().getHeader(Constants.CURRENT_USERNAME);
        String now = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").format(new Date());
        perfTemplate.setCreateBy(username);
        perfTemplate.setCreateTime(now);
        perfTemplate.setStatus(New);
        String templateCode = createContractCode(perfTemplate.getCompanyCode(),"VPT");
        if (StringUtils.isBlank(templateCode) || templateCode == null)
        {
        	return 0;
        }
        perfTemplate.setTemplateCode(templateCode);
        perfTemplateMapper.insertPerfTemplate(perfTemplate);
        return perfTemplateMapper.getIdByTemplateCode(templateCode);
    }
    
    
    /**
     * 修改绩效模板
     *
     * @param perfTemplate 绩效模板
     * @return 结果
     */
    @Override
    public int updatePerfTemplate(PerfTemplate perfTemplate) {
    	
        String username = ServletUtils.getRequest().getHeader(Constants.CURRENT_USERNAME);
        String now = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").format(new Date());
        perfTemplate.setUpdateBy(username);
        perfTemplate.setUpdateTime(now);
        return perfTemplateMapper.updatePerfTemplate(perfTemplate);
    }

    /**
     * 修改绩效模板
     *
     * @param perfTemplate 绩效模板
     * @return 结果
     */
    @Override
    @Transactional(rollbackFor = Exception.class)
    public String updateTempStatus(Map<String, List<PerfTemplate>> datas) {
    	
    	String result = "1";
        String username = ServletUtils.getRequest().getHeader(Constants.CURRENT_USERNAME);
        String now = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").format(new Date());

    	List<String> checkstatus = new ArrayList<String>();
    	for (PerfTemplate perfTemplate : datas.get("datas"))
    	{ 
            perfTemplate.setUpdateBy(username);
            perfTemplate.setUpdateTime(now);
            Integer id = perfTemplate.getId();
            String status = perfTemplateMapper.getStatus(id.longValue());
            if (Publish.equals(perfTemplate.getStatus()))
            {
            	if (!New.equals(status))
            	{
            		return  perfTemplate.getTemplateCode() + "不是新增状态，禁止发布！";
            	}
            }
            
            if (Cancel.equals(perfTemplate.getStatus()))
            {
            	if (New.equals(status))
            	{
            		return  perfTemplate.getTemplateCode() + "是新增状态，不能废止，请直接删除！";
            	}
            	if (Cancel.equals(status))
            	{
            		return  perfTemplate.getTemplateCode() + "是废止状态，不能重复废止！";
            	}
            }
            
             try {
				perfTemplateMapper.updateTempStatus(perfTemplate);
			} catch (Exception e) {
				result = perfTemplate.getTemplateCode() + "模板状态更新失败，请联系管理员！";
				log.error(result, e);
				TransactionAspectSupport.currentTransactionStatus().setRollbackOnly();
				return result;
			}
    	
		}
		if (checkstatus.size() > 0 && checkstatus != null) {
			result = Joiner.on(",").join(checkstatus);
		}
		return result;
    	} 


    /**
     * 删除绩效模板
     *
     * @param id 绩效模板ID
     * @return 结果
     */
    @Override
    public String deletePerfTemplateById(String ids) {
    	String result = "1";
		List<String> checkstatus = new ArrayList<String>();
		String[] tmpids = ids.split(",");
		for (String tmpid : tmpids) {
			Long id = Long.valueOf(tmpid);
			String status  = perfTemplateMapper.getStatus(id);
			if (New.equals(status)) {
				try {
					perfTemplateMapper.deletePerfTemplateById(id);
				} catch (Exception e) {
					result = "删除分类模板失败,模板Id" + id + ",请联系管理员！";
					log.error(result, e);
					TransactionAspectSupport.currentTransactionStatus().setRollbackOnly();
					return result;
				}
			} else {
				result = id + "不是新增状态，不允许删除已发布或废止的模板！";
				checkstatus.add(result);
			}
		}
		if (checkstatus.size() > 0 && checkstatus != null) {
			result = Joiner.on(",").join(checkstatus);
		}
		return result;
    }
    
    /**
	 * 通过redis自增生成考核单号（如：HTBJ202008030001）
	 * 
	 * @param prefix 合同号前缀 companycode 公司code factoryType 公司别名
	 * @return 合同号
	 */
	public String createContractCode(String companycode, String prefix) {
		String factoryType = perfCheckMapper.selectFactoryType(companycode);
		String datetime = new SimpleDateFormat("yyyyMMdd").format(new Date());
		String key = prefix + factoryType + datetime;

		// 查询 key 是否存在， 不存在返回 1 ，存在的话则自增加1
		Long autoID = redisTemplate.opsForValue().increment(key, 1);
		// 这里是 4 位id，如果位数不够可以自行修改 ，下面的意思是 得到上面 key 的 值，位数为 4 ，不够的话在左边补 0 ，比如 110 会变成
		// 0110
		String value = StringUtils.leftPad(String.valueOf(autoID), 4, "0");
		// 然后把 时间戳和优化后的 ID 拼接
		String code = MessageFormat.format("{0}{1}", key, value);
		// 设置三天过期
		redisTemplate.expire(key, 3, TimeUnit.DAYS);
		return code;
	}
}
